return g_string_free (file, FALSE);
}
-static char *
+static GBytes *
diff_with_file (const char *file1,
char *text,
gssize len,
GError **error)
{
- const char *command[] = { "diff", "-u", file1, NULL, NULL };
- char *diff, *tmpfile;
- int fd;
-
- diff = NULL;
-
- if (len < 0)
- len = strlen (text);
-
- /* write the text buffer to a temporary file */
- fd = g_file_open_tmp (NULL, &tmpfile, error);
- if (fd < 0)
+ GSubprocess *process;
+ GBytes *input, *output;
+
+ process = g_subprocess_new (G_SUBPROCESS_FLAGS_STDIN_PIPE
+ | G_SUBPROCESS_FLAGS_STDOUT_PIPE,
+ error,
+ "diff", "-u", file1, "-", NULL);
+ if (process == NULL)
return NULL;
- if (write (fd, text, len) != (int) len)
+ input = g_bytes_new_static (text, len >= 0 ? len : strlen (text));
+ if (!g_subprocess_communicate (process,
+ input,
+ NULL,
+ &output,
+ NULL,
+ error))
{
- close (fd);
- g_set_error (error,
- G_FILE_ERROR, G_FILE_ERROR_FAILED,
- "Could not write data to temporary file '%s'", tmpfile);
- goto done;
+ g_object_unref (process);
+ g_bytes_unref (input);
+ return NULL;
}
- close (fd);
- command[3] = tmpfile;
-
- /* run diff command */
- g_spawn_sync (NULL,
- (char **) command,
- NULL,
- G_SPAWN_SEARCH_PATH,
- NULL, NULL,
- &diff,
- NULL, NULL,
- error);
-
-done:
- g_unlink (tmpfile);
- g_free (tmpfile);
-
- return diff;
+
+ g_bytes_unref (input);
+
+ return output;
}
static void
parse_css_file (GFile *file, gboolean generate)
{
GtkCssProvider *provider;
- char *css, *diff;
- char *css_file, *reference_file, *errors_file;
+ char *css, *css_file, *reference_file, *errors_file;
GString *errors;
+ GBytes *diff;
GError *error = NULL;
css_file = g_file_get_path (file);
diff = diff_with_file (reference_file, css, -1, &error);
g_assert_no_error (error);
- if (diff && diff[0])
+ if (diff && g_bytes_get_size (diff) > 0)
{
- g_test_message ("Resulting CSS doesn't match reference:\n%s", diff);
+ g_test_message ("Resulting CSS doesn't match reference:\n%s",
+ (const char *) g_bytes_get_data (diff, NULL));
g_test_fail ();
}
g_free (reference_file);
+ g_clear_pointer (&diff, g_bytes_unref);
errors_file = test_get_errors_file (css_file);
diff = diff_with_file (errors_file, errors->str, errors->len, &error);
g_assert_no_error (error);
- if (diff && diff[0])
+ if (diff && g_bytes_get_size (diff) > 0)
{
- g_test_message ("Errors don't match expected errors:\n%s", diff);
+ g_test_message ("Errors don't match expected errors:\n%s",
+ (const char *) g_bytes_get_data (diff, NULL));
g_test_fail ();
}
+ g_clear_pointer (&diff, g_bytes_unref);
}
else if (errors->str[0])
{
g_free (errors_file);
g_string_free (errors, TRUE);
- g_free (diff);
-
out:
g_free (css_file);
g_free (css);